package com.sub.structure;

/**
 * @ClassName SubQueue
 * @Description: 队列的实现：队列的底层实现也既可以选择数组也可以选择链表，如下基于已实现的链表实现队列。
 * 队列的特点：先进先出-FIFO，后进后出，基于链表实现，元素只能从队尾入队，从队头出队
 * 方法	功能说明
 * int size()	查询队列元素个数
 * boolean isEmpty()	判断队列是否为空
 * enqueue(E element)	将新元素假如队尾
 * E dequeue()	将队首元素出队，并返回该元素
 * E front()	获取队首元素，但不出队
 * @Author Submerge.
 * @Since 2025/5/19 17:10
 * @Version 1.0
 */
public class SubQueue<E> {

    private SubLinkedList<E> queue;

    public SubQueue() {
        this.queue = new SubLinkedList<>();
    }

    /**
     * 查询队列元素个数
     * @return
     */
    public int size() {
        return this.queue.size();
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty() {
        return this.queue.isEmpty();
    }

    /**
     * 将新元素加入队尾：本质是添加一个节点到链表尾部
     * @param element
     */
    public void enqueue(E element) {
        this.queue.add(element);
    }

    /**
     * 将队首元素出队，并返回该元素：本质是删除链表第一个节点且返回该节点
     * @return
     */
    public E dequeue() {
        if (isEmpty()) {
            return null;
        }
        return this.queue.remove(0);
    }

    /**
     * 获取队首元素，但不出队
     * @return
     */
    public E front() {
        return this.queue.get(0);
    }


    @Override
    public String toString() {
        return "SubQueue{" +
                "queue=" + queue +
                '}';
    }


}
